<?php


namespace App\Utils;


class Xml
{
    use Singleton;

    /**
     * 解析xml文档，转化为对象
     * @param $xmlStr
     * @return bool|mixed
     */
    public function xmlToObject($xmlStr){
        if (!is_string($xmlStr) || empty($xmlStr)) {
            return false;
        }
        // 由于解析xml的时候，即使被解析的变量为空，依然不会报错，会返回一个空的对象，所以，我们这里做了处理，当被解析的变量不是字符串，或者该变量为空，直接返回false
        libxml_disable_entity_loader(true);
        $postObj = json_decode(json_encode(simplexml_load_string($xmlStr, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        //将xml数据转换成对象返回
        return $postObj;
    }

    /**
     * 数组转XML格式字符串
     * @param array $data
     * @param string $rootNode
     * @return string
     */
    public function toXml(array $data, $rootNode = 'xml'){
        // 创建一个文档，文档时xml的，版本号为1.0，编码格式utf-8
        $xmlObj = new \DOMDocument('1.0', 'UTF-8');
        // 创建根节点
        $Node = $xmlObj->createElement($rootNode);
        // 把创建好的节点加到文档中
        $root = $xmlObj->appendChild($Node);
        // 开始把数组中的数据加入文档
        foreach ($data as $key => $value) {
            // 如果是$value是一个数组
            if (is_array($value)) {
                // 先创建一个节点
                $childNode = $xmlObj->createElement($key);
                // 将节点添加到$root中
                $root->appendChild($childNode);
                // 循环添加数据
                foreach ($value as $key2 => $val2) {
                    // 创建节点的同时添加数据
                    $childNode2 = $xmlObj->createElement($key2, $val2);
                    // 将节点添加到$childNode
                    $childNode->appendChild($childNode2);
                }
            } else {
                // 创建一个节点，根据键和值
                $childNode = $xmlObj->createElement($key, $value);
                // 把节点加到根节点
                $root->appendChild($childNode);
            }
        }
        // 把创建好的xml保存到本地
//        $xmlObj->save(__DIR__.'/log.xml');
        return $xmlObj->saveXML();
    }
}
